﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _20161204_Arrays
{
    class Program
    {
        static void Main(string[] args)
        {
            //GetMaxElementOfArray();
            //GetNumberofElementsCriteria();
            //GetSumOfArrayElementsCriteria();
            //GetLastNegativeElementInfo();
            ChangeArrayElementsAfterMax();
        }

        //Пользователь вводит массив из 5 элементов.
        //Найти максимальный элемент массива
        static void GetMaxElementOfArray(int elementsCount = 5)
        {
            int[] array = new int[elementsCount];
            int max = Int32.MinValue;
            for (int i = 0; i < array.Length; i++)
            {
                Console.Write("array[{0}]: ", i);
                array[i] = Int32.Parse(Console.ReadLine());
            }
            PrintArray(array);
            foreach (var i in array)
            {
                if (i > max)
                    max = i;
            }
            Console.WriteLine("Max value is {0}", max);
        }

        //Пользователь вводит размер массива и заполняет.
        //Определить количество элементов в заданном массиве, отличающихся от минимального на 5
        static void GetNumberofElementsCriteria()
        {
            Console.WriteLine("Введите размер массива:");
            int[] array = new int[Int32.Parse(Console.ReadLine())];
            FillArray(array, 9);
            int min = array[0];
            PrintArray(array);
            foreach (var i in array)
            {
                if (i < min)
                    min = i;
            }
            Console.WriteLine("Минимальное значение {0}", min);
            int numberOfElementsCriteria = 0;
            int criteriaValue = min + 5;
            foreach (var i in array)
            {
                if (i == criteriaValue)
                    numberOfElementsCriteria++;
            }
            Console.WriteLine("Количество элементов, которые отличаются от минимального значения на 5 - {0}", numberOfElementsCriteria);
        }

        //Дан одномерный массив, размер массива задается пользователем из консоли.
        //Найти сумму элементов, расположенных до максимального элемента массива.
        //Если максимальных элементов несколько - то найти сумму элементов до первого максимального элемента. 
        //Если максимальный элемент первый в массиве - то сумма равна 0

        static void GetSumOfArrayElementsCriteria()
        {
            Console.WriteLine("Введите размер массива:");
            int[] array = new int[Int32.Parse(Console.ReadLine())];
            FillArray(array, 100);
            PrintArray(array);
            int sum = GetSummOfArrayElements(array, getNumberOfFirstMaxArrayElement(array));
        }

        //Определить значение и номер последнего отрицательного элемента массива размером 8. 
        //Если отрицательных элементов нет - вывести соответствующее сообщение.
        static void GetLastNegativeElementInfo()
        {
            int[] array = FillArray(8, -10, 10);
            bool isNegativeElementExists = false;
            PrintArray(array);
            
            for (int i = array.Length - 1; i >= 0; i--)
            {
                if (array[i] < 0)
                {
                    Console.WriteLine("Индекс последнего отрицательно элемента {0}", i);
                    Console.WriteLine("Значение последнего отрицательно элемента {0}", array[i]);
                    isNegativeElementExists = true;
                    break;
                }
            }
            if (isNegativeElementExists == false)
                Console.WriteLine("Массив не содержит отрицательных элементов.");

        }

        //В одномерном массиве все элементы, расположенные после максимального, 
        //заменить средним значением элементов массива.
        //Вывести обновленный массив на экран. Размер массива указывается пользователем
        static void ChangeArrayElementsAfterMax()
        {
            Console.WriteLine("Введите размер массива:");
            int[] array = FillArray(Int32.Parse(Console.ReadLine()));
            Console.Write("Начальный ");
            PrintArray(array);
            int maxIndex = Array.IndexOf(array, array.Max());
            int middleValue = array.Sum() / array.Length;
            for (int i = maxIndex + 1; i < array.Length; i++)
            {
                array[i] = middleValue;
            }
            Console.Write("Финальный ");
            PrintArray(array);
        }
        
        //возвращает сумму элементов массива от нулевого до lastIndex
        //если lastIndex = 0 или lastIndex >= array.Length , возвращает сумму всех элементов
        //если lastIndex < 0, возвращает 0

        static int GetSummOfArrayElements(int[] array, int lastIndex)
        {
            if (lastIndex < 0) return 0;

            int sum = 0;
            if (lastIndex == 0 || lastIndex > array.Length)
                lastIndex = array.Length;
            for (int i = 0; i < lastIndex; i++)
            {
                sum += array[i];
            }
            Console.WriteLine("Сумма элементов с 0 до {0} (невключительно): {1}", lastIndex, sum);
            return sum;
        }

        //возвращает индекс максимального элемента
        //Если максимальное значение содержит несколько элементов, вернет индекс первого из них
        static int getNumberOfFirstMaxArrayElement(int[] array)
        {
            int number = 0;
            int max = Int32.MinValue;
            for (int i = 0; i < array.Length; i++)
            {
                if (array[i] > max)
                {
                    max = array[i];
                    number = i;
                }
            }
            Console.WriteLine("Максимальное значение в массиве: {0}", max);
            Console.WriteLine("Индекс: {0}", number);
            return number;
        }

        static void PrintArray(int[] array)
        {
            Console.WriteLine("Массив:");
            foreach (int i in array)
            {
                Console.Write("{0} ", i);
            }
            Console.WriteLine();
        }

        static void FillArray(int[] array, int maxValue)
        {
            Random rand = new Random();
            for (int i = 0; i < array.Length; i++)
            {
                array[i] = rand.Next(maxValue + 1);
            }
        }

        static int[] FillArray(int arraySize, int minValue = 0, int maxValue = 100)
        {
            int[] array = new int[arraySize];
            Random rand = new Random();
            for (int i = 0; i < array.Length; i++)
            {
                array[i] = rand.Next(minValue, maxValue + 1);
            }
            return array;
        }
    }
}
